package com.study.compose.beta.activity.coroutines

import androidx.lifecycle.LiveData
import androidx.lifecycle.MutableLiveData
import com.module.compose.base.net.API
import com.module.compose.base.viewModel.OurViewModel
import com.study.compose.beta.api.BlogApi
import com.study.compose.beta.entity.History

class BlogHistoryViewModel : OurViewModel() {

    /**
     * api对象注入，依赖项注入的作用：
     * 1.解耦和单一职责，创建api对象的任务不应该由viewModel去执行，
     * 当我们处理紧耦合的模块时，对一个地方的代码改动，便意味对其他的模块作出许多其他的改动。更糟的是，耦合常常是隐式的，以至于看起来毫无关联的修改，却会造成了意料之外的错误发生。
     *
     * 2.业务分层，基于MVVM架构思想，数据请求的api对象应该设计成只能被viewModel依赖，
     * 如果使用单例或提供工厂创建对象，就打破了这种关系，会导致api对象可以被任何类进行依赖，使用注解就可以很好的解决这个问题，因为可以只为
     * 需要注入的类实现inject()方法，当前项目的api对象没有暴露任何公有的创建其对象的方法，只能通过 @API 注解在viewModel
     * 中创建其实例
     */
    @API
    private lateinit var api: BlogApi

    /**
     * 单向数据流设计模式
     * 事件(例如：点击操作)--->viewModel处理数据
     * viewModel(处理数据)--->View响应事件
     *
     * 对外只暴露出只读数据LiveData，不给UI层直接修改数据的权限，使其把主要职责放在UI的处理上
     *
     */
    private val _blogHistory = MutableLiveData<History>()
    val blogHistory: LiveData<History> = _blogHistory

    //页面刷新状态
    private val _refreshState = MutableLiveData<Boolean>()
    val refreshState: LiveData<Boolean> = _refreshState

    /**
     * 获取数据
     */
    fun getBlogHistory(blogId: String, isRefresh: Boolean = false) {
        //处理下拉刷新
        if (isRefresh) {
            _refreshState.value = isRefresh
        }
        //校验数据结果
        verify(
            suc = {
                //更新页面状态
                _refreshState.value = false
                _blogHistory.value = it
            },
            fail = {
                _refreshState.value = false
                showToast(it)
            },
        ) {
            api.blogHistory(blogId = blogId, page = "1")
        }

    }
}